package com.edu.springmvc.helloworld.controller;

import com.edu.springmvc.helloworld.bean.Person;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@RestController // 默认返回值是json
//@Controller
public class HelloController {

    @RequestMapping("/hello")
    @ResponseBody // 把返回值放到响应体中
    public String hello() {
        return """
                Hello, Spring MVC!
                你好，世界。
                """; // 默认是认为返回值是跳转到一个页面
    }

    /**
     * 路径位置通配符: 多个都能匹配上，精确优先
     * 精确匹配 > ? > * > **
     * ? 匹配一个字符
     * * 匹配任意字符
     * ** 匹配任意字符，包括多层路径
     */
    @RequestMapping("/hell?")
    @ResponseBody
    public String hello2() {
        return "hello, world!"; // 默认是认为返回值是跳转到一个页面
    }

    /**
     * POST 请求
     * 返回 json
     */
    @PostMapping("/hello3")
    public String hello3() {
        return "hello, world!"; // 默认是认为返回值是跳转到一个页面
    }

    /**
     * POST 请求
     * 返回 json
     * consumes = "application/json"
     * 表示只接受 application/json 的请求
     * produces = "application/json"
     * consumes : 表示请求的媒体类型, produces : 响应的媒体类型
     *
     * @return 响应 json
     */
    @RequestMapping(value = "/hello4", consumes = "application/json")
    public String hello4() {
        return "hello4()"; // 默认是认为返回值是跳转到一个页面
    }

    /**
     * GET 请求
     * 1. 参数的位置可以任意
     * 2. 没有携带，数据自动封装为null。
     * 要求： 参数类型必须和路径中的参数类型一致。变量名，必须和路径中的参数名一致。
     * 3. 参数类型不一致，会自动转换。
     * 能否是基本数据类型？  可以
     * 4. @RequestParam注解的属性，默认必须携带，但是可以设置默认值。
     *
     * @param name   默认值为 null
     * @param age    默认值为 0
     * @param isMale 默认值为 false
     * @return 响应 json
     */
    @GetMapping("/hello5")
    public String hello5(String name,
                         int age,
                         @RequestParam(value = "isMale", defaultValue = "false") Boolean isMale) {
        System.out.println(name);
        System.out.println(age);
        System.out.println(isMale);
        return "hello5()"; // 默认是认为返回值是跳转到一个页面
    }

    /*
    如果目标方法参数是一个对象，那么SpringMVC会自动将路径中的参数封装为对象。
    自动把请求参数和pojo属性进行匹配。
     */
    @GetMapping("/hello6")
    public String hello6(Person person, @RequestHeader("host") String host) {
        person.setName("Jobs");
        System.out.println(person);
        return "hello6()" + host;
    }

    /**
     * 测试接收json请求体
     *
     * @RequestBody 表示接收json请求体
     * 1. 拿到请求体中的Json字符串
     * 2. 把Json字符串转换为对象
     */
    @PostMapping("/hello7")
    public String hello7(@RequestBody Person person) {
        System.out.println(person);
        return "hello7()";
    }

    /**
     * 文件上传
     *
     * @param person Person
     * @param file   MultipartFile 表示上传的文件
     * @return 响应 json
     */
    @RequestMapping("/hello8")
    public String hello8(Person person,
                         @RequestParam("fileName") MultipartFile file,
                         @RequestPart("lifeImg") MultipartFile files) throws IOException {
        System.out.println(person);

        System.out.println("file.getName() = " + file.getName());
        System.out.println("file.getOriginalFilename() = " + file.getOriginalFilename());
        System.out.println("file.getSize() = " + file.getSize());
        System.out.println("file.getContentType() = " + file.getContentType());
        System.out.println("file.isEmpty() = " + file.isEmpty());
        file.transferTo(new File("D:\\" + file.getOriginalFilename()));

        return "hello8()";
    }

    @RequestMapping("/hello9")
    public String hello9(HttpEntity<String> entity) {
        System.out.println(entity.getBody());
        System.out.println(entity.getHeaders());
        System.out.println(entity.hasBody());
        return "hello9()";
    }

    // 接收原生API
    @RequestMapping("/hello10")
    public void hello10(HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println(request.getMethod());
        System.out.println(request.getRequestURI());
        System.out.println(request.getQueryString());
        response.getWriter().write("hello10");
    }

}
